package org.gtesoreria

class PrestamoService {

    static transactional = true
	def adelantoService
	def consumoService
	
    def getPrestamoByAfiliado(Afiliado af) {
		def query = Prestamo.createCriteria()
		def prestamosDe = query.list() {
			eq("afiliado", af)
			eq("estado",Prestamo.PRESTAMO_ACTIVO)
			maxResults(1)
			
		}
		if(prestamosDe)
			return prestamosDe.get(0)
		else
			return null
    }
	
	def setPrestamoInConsumosAndAdelantos(Afiliado af, Prestamo prestamo){
		def adelantos = adelantoService.adelantosEnEstado(af, Adelanto.A_PRESTAMO)
		def consumos = consumoService.consumosEnEstado(af, Rubro.rubroAuto.codigo, Adelanto.A_PRESTAMO)
		consumos.addAll consumoService.consumosEnEstado(af, Rubro.rubroFarmacia.codigo, Adelanto.A_PRESTAMO)
		consumos.addAll consumoService.consumosEnEstado(af, Rubro.rubroInd.codigo, Adelanto.A_PRESTAMO)
		consumos.addAll consumoService.consumosEnEstado(af, Rubro.rubroSuper.codigo, Adelanto.A_PRESTAMO)
		consumos.addAll consumoService.consumosEnEstado(af, Rubro.rubroVarios.codigo, Adelanto.A_PRESTAMO)
		adelantos.each { adelanto ->
			adelanto.estado = Adelanto.FINANCIADO
			adelanto.prestamo = prestamo
			adelanto.save()
		}
		consumos.each { consumo ->
			consumo.estado = Adelanto.FINANCIADO
			consumo.prestamo = prestamo
			consumo.save()
		}
	}
	
	def consumosOfPrestamo(Prestamo prestamo){
		def query = Consumo.createCriteria()
		def adelantosPendientes = query {
			eq("estado", Adelanto.FINANCIADO)
			eq("prestamo",prestamo)
			}
		}
	
	
	def adelantosOfPrestamo(Prestamo prestamo){
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query {
			eq("estado", Adelanto.FINANCIADO)
			eq("prestamo",prestamo)
			}
	}
	
	def afiliadosConPrestamos() {
		def query = Prestamo.createCriteria()
		def adelantosPendientes = query.listDistinct() {
			order("fechaOtorgamiento","asc")
			projections {
				property("afiliado")
			}
		}
	}
	
	def getActualTotalARefinanciar(Afiliado af){
		def adelantos = adelantoService.adelantosEnEstado(af, Adelanto.A_PRESTAMO)
		def consumosAuto = consumoService.consumosEnEstado(af, Rubro.rubroAuto.codigo, Adelanto.A_PRESTAMO)
		def consumosFarmacia = consumoService.consumosEnEstado(af, Rubro.rubroFarmacia.codigo, Adelanto.A_PRESTAMO)
		def consumosInd = consumoService.consumosEnEstado(af, Rubro.rubroInd.codigo, Adelanto.A_PRESTAMO)
		def consumosSuper = consumoService.consumosEnEstado(af, Rubro.rubroSuper.codigo, Adelanto.A_PRESTAMO)
		def consumosVarios = consumoService.consumosEnEstado(af, Rubro.rubroVarios.codigo, Adelanto.A_PRESTAMO)
		def totalARefinanciar = adelantoService.getSubTotal(adelantos) + 
								consumoService.getSubTotalDescuento(consumosAuto) + 
								consumoService.getSubTotalDescuento(consumosFarmacia) +
								consumoService.getSubTotalDescuento(consumosInd) + 
								consumoService.getSubTotalDescuento(consumosSuper) + 
								consumoService.getSubTotalDescuento(consumosVarios)
		return totalARefinanciar
	}
	
	def cuotasEntreFechasADescuento(Date from, Date to){
		def query = Cuota.createCriteria()
		def cuotasPendientes = query.list() {
			between("fechaVencimiento",from, to)
			eq("isPagada", false)
			order("fechaVencimiento","asc")
			credito{eq("estado", Prestamo.PRESTAMO_ACTIVO)}
			
		}
	}
	
	def cuotasPagadasEntreFechas(Date from, Date to){
		def query = Cuota.createCriteria()
		def cuotasPendientes = query.list() {
			between("fechaVencimiento",from, to)
			eq("isPagada", true)
			order("fechaVencimiento","asc")
			credito{eq("estado", Prestamo.PRESTAMO_ACTIVO)}
			
		}
	}
	
	def getSubTotal(List<Cuota> cuotas){
		Double result = 0.0
		for(Cuota c in cuotas){
			result += c.monto
		}
		return result	
	}
	
	def getSubTotalPendiente(List<Prestamo> prestamos){
		Double result = 0.0
		for(Prestamo c in prestamos){
			result += c.pendiente
		}
		return result
	}
	
	def getPrestamosConPendiente(){
		def query = Prestamo.createCriteria()
		def pendientes = query.list() {
			isNotNull("pendiente")
			order("fechaOtorgamiento","asc")
		}
		return pendientes
	}
	
	def removeCuotas(Prestamo prestamo){
		for(Cuota cuota in prestamo.cuotas){
			
		}
	}
	
	def updateCuotasAPagadas(List cuotas){
		for(Cuota c in cuotas){
			c.isPagada = true;
			c.save(flush:true)
		}
	}
}
